package cn.cms.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URL;

/**
 * Created by wangzz on 2017/10/25.
 */
public class StringUtil {

    private static Logger logger = LoggerFactory.getLogger(StringUtil.class);

    /**
     * 文件路径替换
     */
    public static final String FILE_SEPARATOR_REG = File.separator.equals("/") ? File.separator
            : File.separator + File.separator;

    /**
     * 解析文件路径，classpath前缀
     */
    private static final String FILE_PRE_CLASSPATH = "classpath:";
    /**
     * 解析文件路径，classpath前缀
     */
    private static final String FILE_PRE_WEBROOT = "webroot:";

    /**
     * 根据操作系统的不一致转换文件路劲，可以读取的文件格式为
     * classpath:dir1/dir1/file1 :基于classpath读取
     * webroot:dir1/dir1/file1 :基于web工程读取
     * d:/dir1/dir1/file1 :据对路径读取
     *
     * @param inPath 输入文件路径
     * @return 与操作系统对应的文件路径
     */
    public static String formatFilePath(String inPath) {
        if (logger.isDebugEnabled()) {
            logger.debug("调用【formatFilePath】方法开始，入参： [inPath]=" + inPath);
        }
        String realFilePath = "";
        if (StringUtil.isNotEmptyOrNull(inPath) && inPath.startsWith(FILE_PRE_CLASSPATH)) {
            ClassLoader classLoader = StringUtil.class.getClassLoader();
            String fileClassPath = inPath.substring(10, inPath.length());
            URL url = classLoader.getResource(fileClassPath);
            if (url == null) {
                throw new RuntimeException("文件读取失败："+ fileClassPath);
            } else {
                realFilePath = url.getFile();
            }
        } else if (StringUtil.isNotEmptyOrNull(inPath) && inPath.startsWith(FILE_PRE_WEBROOT)) {
            String webRoot = App.getAppPath();
            if (!webRoot.endsWith(File.separator)) {
                webRoot += File.separator;
            }
            realFilePath = webRoot + inPath.substring(8, inPath.length());
        } else {
            realFilePath = inPath;
        }
        // 特殊字符替换
        realFilePath = realFilePath.replaceAll("\\\\", FILE_SEPARATOR_REG);
        realFilePath = realFilePath.replaceAll("/", FILE_SEPARATOR_REG);
        // 返回处理结果
        try {
            realFilePath = java.net.URLDecoder.decode(realFilePath, "utf-8");
        } catch (UnsupportedEncodingException e) {
            logger.error("路径转换编码错误: ", e);
        }
        if (logger.isDebugEnabled()) {
            logger.debug("调用【formatFilePath】方法结束，出参： [realFilePath]=" + realFilePath);
        }
        return realFilePath;
    }

    /**
     * 验证对象不为空也不为NULL
     *
     * @param str 验证对象
     * @return 处理结果 空/Null:true,否则:false
     */
    public static boolean isNotEmptyOrNull(Object str) {
        if (!"".equals(str) && null != str && !str.equals(null)) {
            return true;
        }
        return false;
    }

    /**
     * 验证对象是否为空或NULl
     *
     * @param str 验证对象
     * @return 处理结果 空/Null:true,否则:false
     */
    public static boolean isEmptyOrNull(Object str) {
        return !isNotEmptyOrNull(str);
    }

    /**
     * 验证字符串是否为空字符串或NULl
     *
     * @param str 验证对象
     * @return 处理结果 空/Null:true,否则:false
     */
    public static boolean isSpaceOrNull(String str) {
        if (null == str || "".equals(str.trim())) {
            return true;
        }
        return false;
    }

    /**
     * 过滤路径中的特殊字符，防止xss漏洞攻击
     * @param value %27:' %22:" %3E:> %3C:< %3D:= %2F:/
     * @return
     */
    public static String xssFilter (String value) {
        if (isEmptyOrNull(value)) {
            return "";
        }
        value = value.replaceAll("\r", "")
                .replaceAll("\n", "")
                .replaceAll("(?i)script", "")
                .replaceAll("(?i)alert", "")
                .replaceAll("(?i)prompt", "")
                .replaceAll("%27", "")
                .replaceAll("%22", "")
                .replaceAll("%3E", "")
                .replaceAll("%3C", "")
                .replaceAll("%3D", "")
                .replaceAll("%2F", "");
        return value;
    }

}
